Skip to content

[SCRUM-52] Pipeline de auto-apply de sugestoes de relatorio#37

Draft
notsogreatdavi wants to merge 10 commits intodevfrom
feature/SCRUM-52-auto-apply-pipe
Draft

[SCRUM-52] Pipeline de auto-apply de sugestoes de relatorio#37
notsogreatdavi wants to merge 10 commits intodevfrom
feature/SCRUM-52-auto-apply-pipe

Conversation

@notsogreatdavi
Copy link
Copy Markdown
Collaborator

@notsogreatdavi notsogreatdavi commented Apr 25, 2026

🎯 Objetivo

Implementa o pipeline completo de auto-apply para a SCRUM-52: permite aplicar sugestoes de melhoria (geradas por relatorio IA) diretamente nos dados da empresa e do cardapio, tanto de forma individual quanto em lote a partir de um relatorio existente.


📁 Arquivos Criados

Arquivo Propósito
app/core/exceptions.py Exceções de domínio: FieldNotAllowed, InvalidFieldValue, AutoApplyPersistence, SuggestionExtraction
app/schemas/auto_apply.py Schemas Pydantic v2: AutoApplyRequest/Response, Suggestion, SuggestionResult, ReportAutoApplyResponse
app/services/auto_apply_service.py Service com whitelist de campos, mapeamento lógico para coluna real, coerção de tipos e parsing de horário
app/services/report_auto_apply_service.py Service que extrai sugestões do relatório via Gemini Flash e aplica em lote com commit unico
app/routers/auto_apply.py Router dedicado para POST /auto-apply (aplicação individual)
tests/test_auto_apply_service.py 16 testes BDD para AutoApplyService (cobertura 100%)
tests/test_report_auto_apply_service.py 12 testes BDD para ReportAutoApplyService (cobertura 100%)
tests/test_auto_apply_router.py 5 smoke tests para POST /auto-apply

✏️ Arquivos Alterados

Arquivo O que mudou
app/main.py Registra router auto_apply, handlers para novas exceções, handler 500 com mensagem genérica
app/routers/reports.py Adiciona endpoint POST /{report_id}/auto-apply com DI do ReportAutoApplyService
app/services/report_service.py Enriquece system prompt com diretrizes para sugestões acionáveis com valores concretos
tests/test_reports_router.py Adiciona 4 smoke tests para POST /{report_id}/auto-apply

🧪 Como Testar

Pré-requisitos

  1. Abrir o deploy do PR: https://mandaca-backend-staging-pr-37.onrender.com/docs
  2. Ter no banco uma empresa cadastrada com pelo menos um item de cardapio e um relatorio IA gerado

Teste 1: Auto-apply individual (POST /auto-apply)

  1. No Swagger, localizar a seção auto-apply e expandir POST /auto-apply
  2. Clicar em Try it out
  3. Preencher o body com um campo permitido de empresa:
{
  "enterprise_id": "<UUID da empresa>",
  "target": "enterprise",
  "campo_para_alterar": "historia",
  "novo_valor": "Restaurante familiar fundado em 2010 no sertao pernambucano"
}
  1. Clicar em Execute
  2. Esperado: status 200 com body {"campo_alterado": "historia", "status": "aplicado"}
  3. Verificar no GET /enterprises/{id} que o campo historia foi atualizado

Teste 2: Auto-apply de item do cardapio (POST /auto-apply)

  1. Repetir o fluxo acima, mas agora com target menu_item:
{
  "enterprise_id": "<UUID da empresa>",
  "target": "menu_item",
  "menu_item_id": "<UUID do item de cardapio>",
  "campo_para_alterar": "preco",
  "novo_valor": "25.90"
}
  1. Esperado: status 200 com {"campo_alterado": "preco", "status": "aplicado"}

Teste 3: Campo nao permitido (POST /auto-apply)

  1. Enviar um campo fora da whitelist (ex: "campo_para_alterar": "owner_id")
  2. Esperado: status 422 com mensagem "Campo não permitido para alteração automática: owner_id"

Teste 4: Auto-apply em lote a partir de relatorio (POST /reports/{report_id}/auto-apply)

  1. Primeiro, gerar um relatorio via POST /reports/generate/{empresa_id} e copiar o id_relatorio retornado
  2. No Swagger, localizar a seção reports e expandir POST /reports/{report_id}/auto-apply
  3. Clicar em Try it out e colar o report_id
  4. Clicar em Execute
  5. Esperado: status 200 com body contendo:
    • report_id: UUID do relatorio
    • total: quantidade de sugestoes extraidas pela IA
    • aplicadas: quantas foram aplicadas com sucesso
    • rejeitadas: quantas falharam (campo invalido, entidade nao encontrada, etc.)
    • resultados: lista detalhada com cada sugestao, seu status (aplicado/rejeitado) e mensagem de erro quando rejeitada
  6. Verificar nos endpoints GET /enterprises/{id} e GET /menus/{id} que os campos aplicados foram atualizados

Teste 5: Relatorio inexistente (POST /reports/{report_id}/auto-apply)

  1. Enviar um UUID que nao existe como report_id
  2. Esperado: status 404 com mensagem "Relatório IA não encontrado: <UUID>"

Testes automatizados

pytest tests/test_auto_apply_service.py tests/test_report_auto_apply_service.py tests/test_auto_apply_router.py tests/test_reports_router.py -v

@github-actions
Copy link
Copy Markdown
Contributor

Coverage

Coverage Report
FileStmtsMissCoverMissing
main.py67198%127
core
   config.py130100% 
   exceptions.py96297%142–143
   session.py120100% 
   supabase_client.py30100% 
models
   __init__.py100100% 
   assessment.py210100% 
   business_context.py150100% 
   chat_message.py150100% 
   enterprise.py280100% 
   menu.py230100% 
   notification.py160100% 
   photo.py110100% 
   report.py200100% 
   reservation.py150100% 
   user.py200100% 
routers
   assessments.py260100% 
   auto_apply.py110100% 
   business_context.py250100% 
   chat.py170100% 
   enterprises.py290100% 
   menus.py260100% 
   notifications.py270100% 
   photos.py976730%32, 38–40, 44, 50–52, 57, 68–70, 75–76, 81, 83–85, 90–91, 93–94, 96, 105, 107, 112–113, 115–117, 122, 124–125, 127, 137–139, 144–145, 150–158, 163–164, 166–167, 169, 178, 180–182, 184, 186–188, 197–199, 204–205, 207
   reports.py260100% 
   transcriptions.py110100% 
   users.py885735%27, 47–49, 53, 65–67, 72, 74–76, 81–82, 85, 87, 89, 98, 100–101, 103, 110–113, 126–128, 133–134, 142–143, 147, 149–150, 152–153, 155–157, 162–163, 166, 168, 170, 179, 183–184, 186–187, 189, 195, 197–198, 203–205
schemas
   __init__.py00100% 
   assessments.py190100% 
   auto_apply.py380100% 
   business_contexts.py160100% 
   chat.py180100% 
   enterprises.py510100% 
   menus.py280100% 
   notification.py190100% 
   reports.py240100% 
   transcriptions.py110100% 
services
   __init__.py00100% 
   assessment_service.py835237%24, 51–53, 57, 60–61, 64–66, 71–73, 78–81, 86, 93–96, 104, 106–109, 113, 115–118, 122, 124–128, 132–133, 135–137, 140–143, 146–148, 153–154
   auto_apply_service.py730100% 
   business_context_builder_service.py392730%20–22, 24, 26–35, 39–40, 45–47, 51–53, 62, 67–68, 71, 75
   business_context_service.py54492%76–78, 80
   chat_context_service.py410100% 
   chat_service.py440100% 
   context_validation_service.py320100% 
   enterprise_service.py780100% 
   geocoding_service.py390100% 
   menu_service.py520100% 
   notification.py270100% 
   report_auto_apply_service.py570100% 
   report_service.py57198%92
   transcription_service.py900100% 
TOTAL175821188% 

@notsogreatdavi notsogreatdavi self-assigned this Apr 25, 2026
@notsogreatdavi notsogreatdavi added the enhancement New feature or request label Apr 25, 2026
@notsogreatdavi notsogreatdavi requested a review from degoNDL April 25, 2026 14:44
@Guilherme-leo Guilherme-leo removed the request for review from degoNDL April 25, 2026 16:50
Copy link
Copy Markdown
Collaborator

@Guilherme-leo Guilherme-leo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Assim como conversado na última reunião, será necessário bloquearmos essa task por enquanto, devido às funcionalidades, entidades e informações que serão adicionadas nos épicos posteriores, bem como às possíveis alterações nos épicos já desenvolvidos quando integrados ao frontend.

@notsogreatdavi notsogreatdavi marked this pull request as draft April 26, 2026 18:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants